"""
read_data
"""
import os

import pandas as pd

from mindspore import Tensor
from mindspore.common import dtype as mstype

from .build_feature import BuildFeature
from .normalization import Normalization


def get_datalist_from_txt(data_file):
    """
    从文本文件读取数据集列表并合并为统一DataFrame
    适用于读取包含多个数据文件路径的索引文件
    
    Args:
        data_file (str): 包含数据文件路径的文本文件
        
    Returns:
        pd.DataFrame: 合并后的数据集
    """
    std_data_path = 'dataset/data_std'  # 标准数据路径
    file_list = []
    # 读取文本文件中的所有数据文件路径
    with open(data_file, encoding="utf-8") as dat_file:
        for line in dat_file:
            file_list.append(line.strip())
    
    all_data = []
    # 逐个读取数据文件并合并
    for file in file_list:
        data_path = os.path.join(std_data_path, file)
        df_data = pd.read_csv(data_path)
        all_data.append(df_data)
    
    # 合并所有数据并过滤掉壁面距离为0的无效数据
    df_data = pd.concat(all_data)
    df_data = df_data[df_data['dis'] > 0]
    return df_data


def get_tensor_data(df_data, feature_method, label_method, file_path):
    """
    从DataFrame提取物理量并处理为模型输入张量
    包含特征构建、归一化等完整数据处理流程
    
    Args:
        df_data (pd.DataFrame): 原始数据集
        feature_method (str): 特征归一化方法（"MinMax"或"Std"）
        label_method (str): 标签归一化方法（"MinMax"或"Std"）
        file_path (str): 标准化参数文件路径
        
    Returns:
        tuple: 处理后的特征、标签、应变率和雷诺应力张量
    """
    # 从DataFrame提取原始物理量并转换为MindSpore张量
    aoa = Tensor(df_data['AoA'].values, mstype.float32)       # 攻角
    reynolds = Tensor(df_data['Re'].values, mstype.float32)   # 雷诺数
    dis = Tensor(df_data['dis'].values, mstype.float32)       # 到壁面距离
    ux_value = Tensor(df_data['Ux'].values, mstype.float32)   # u对x的偏导数(∂u/∂x)
    u_value = Tensor(df_data['U'].values, mstype.float32)     # x方向速度
    v_value = Tensor(df_data['V'].values, mstype.float32)     # y方向速度
    uy_value = Tensor(df_data['Uy'].values, mstype.float32)   # u对y的偏导数(∂u/∂y)
    vx_value = Tensor(df_data['Vx'].values, mstype.float32)   # v对x的偏导数(∂v/∂x)
    vy_value = Tensor(df_data['Vy'].values, mstype.float32)   # v对y的偏导数(∂v/∂y)
    mut = Tensor(df_data['Mut'].values, mstype.float32)       # 涡粘性系数
    y_value = Tensor(df_data['Y'].values, mstype.float32)     # y坐标
    p_value = Tensor(df_data['P'].values, mstype.float32)     # 压力
    ru_value = Tensor(df_data['Ru'].values, mstype.float32)   # 密度与速度乘积

    # 特征工程：基于原始物理量构建湍流相关特征
    bf_op = BuildFeature()
    data, mut = bf_op(mut, aoa, reynolds, dis, p_value, ru_value,
                      y_value, u_value, v_value, ux_value, uy_value, vx_value, vy_value)

    # 数据归一化：对特征和标签进行标准化处理
    norm_op = Normalization(feature_method, label_method, file_path)
    data = norm_op.normalize_feature(data)            # 特征归一化
    label, sij, rs_value = norm_op.normalize_label(mut, uy_value, vx_value)  # 标签及相关物理量归一化
    
    return data, label, sij, rs_value